/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package br.ufc.quixada.adrs.comandos.supervisor;

import br.ufc.quixada.adrs.interfaces.Comando;
import br.ufc.quixada.adrs.model.Administrador;
import br.ufc.quixada.adrs.model.Contato;
import br.ufc.quixada.adrs.model.Endereco;
import br.ufc.quixada.adrs.model.Usuario;
import br.ufc.quixada.adrs.service.AdministradorService;
import br.ufc.quixada.adrs.service.MunicipioService;
import br.ufc.quixada.adrs.service.PapelService;
import br.ufc.quixada.adrs.service.UsuarioService;
import br.ufc.quixada.adrs.util.Msg;
import br.ufc.quixada.adrs.util.SendMail;
import br.ufc.quixada.adrs.util.UtilAdrs;
import java.util.ArrayList;
import java.util.Date;
import javax.mail.MessagingException;
import javax.mail.internet.AddressException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.slf4j.LoggerFactory;

/**
 *
 * @author Franklin
 */
public class CmdAddAdministrador implements Comando {

    public String executa(HttpServletRequest request, HttpServletResponse response) {
        HttpSession session = request.getSession(true);

        //dados usuario
        String usuario_nome = (String) request.getParameter("nome");
        session.setAttribute("nome", usuario_nome);
        String apelido = (String) request.getParameter("apelido");
        session.setAttribute("apelido", apelido);
        String rg = (String) request.getParameter("rg");
        session.setAttribute("rg", rg);
        String cpf = (String) request.getParameter("cpf");
        session.setAttribute("cpf", cpf);
        String contato1 = (String) request.getParameter("contato1");
        session.setAttribute("contato1", contato1);
        String contato2 = (String) request.getParameter("contato2");
        session.setAttribute("contato2", contato2);
        String email = (String) request.getParameter("email");
        session.setAttribute("email", email);
        String login = (String) request.getParameter("login");
        session.setAttribute("login", login);
        String localidade = (String) request.getParameter("localidade");
        session.setAttribute("localidade", localidade);
        String municipio_id = (String) request.getParameter("municipio");
        String estado_id = (String) request.getParameter("estado");

        UsuarioService usuarioService = new UsuarioService();
        AdministradorService administradorService = new AdministradorService();
        MunicipioService municipioService = new MunicipioService();
        Date data = new Date();

        Administrador alterar_administrador = null;
        if (!request.getParameter("operacao_administrador").equalsIgnoreCase("0")) {
            alterar_administrador = new AdministradorService().getAdministradorById(Long.parseLong(request.getParameter("operacao_administrador")));
        }
        if (cpf.length() != 14) {
            session.setAttribute("erro", Msg.INPUT_ERROR_INVALID_PRODUTOR_CPF);
            session.setAttribute("atualizar_administrador", alterar_administrador);
            return "/supervisor/supervisor_add_admin.jsp";
        }

        if (usuario_nome == null || apelido == null || cpf == null || contato1 == null || rg == null
                || localidade == null || municipio_id.equalsIgnoreCase("-1") || estado_id.equalsIgnoreCase("-1")
                || usuario_nome.trim().isEmpty() || apelido.trim().isEmpty() || rg.trim().isEmpty()
                || cpf.trim().isEmpty() || contato1.trim().isEmpty() || localidade.trim().isEmpty()) {
            session.setAttribute("erro", Msg.REQUIRED_FIELDS);
            session.setAttribute("atualizar_administrador", alterar_administrador);
            return "/supervisor/supervisor_add_admin.jsp";
        }

        if (request.getParameter("operacao_administrador").equalsIgnoreCase("0")) {//
            //Criando Endereço
            Endereco endereco = new Endereco();
            endereco.setLocalidade(localidade);
            endereco.setDistanciaSede(0);
            endereco.setMunicipio(municipioService.getMunicipioById(Long.parseLong(municipio_id)));

            //Criando Usuário
            Usuario usuario = new Usuario();
            usuario.setNome(usuario_nome);
            usuario.setApelido(apelido);
            usuario.setCpf(cpf);
            usuario.setRg(rg);
            usuario.setEndereco(endereco);
            usuario.setEmail(email);
            usuario.setLogin(login);
            usuario.setSenha(UtilAdrs.criptografar("admin30062011"));
            usuario.setContatos(new ArrayList<Contato>());

            //Criando Contato
            Contato c1 = new Contato();
            c1.setNumero(contato1);
            c1.setUsuario(usuario);
            usuario.getContatos().add(c1);

            Contato c2 = new Contato();
            if (contato2.trim().isEmpty() != true) {
                c2.setNumero(contato2);
                c2.setUsuario(usuario);
                usuario.getContatos().add(c2);
            }

            //Criando Perfil
            Administrador perfil = new Administrador();
            perfil.setAtivo(true);
            perfil.setDataCriacao(data);
            perfil.setUsuario(usuario);
            perfil.setPapel(new PapelService().getPapelById(2L));

            //Adicionando Administrador
            if (administradorService.insertAdministrador(perfil)) {
                try {
                    String mensagem = "Prezado(a) " + usuario.getNome() + " Acabamos de receber seu cadastro no sistema ADRS. Para acessar o sistema:"
                            + "Seu login é: " + usuario.getLogin() + ". A sua senha é: admin30062011" + "\n"
                            + "Bom trabalho!";
                    SendMail.sendMail(email, "Novo cadastro no sistema ADRS.", mensagem);
                } catch (AddressException ex) {
                    LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
                } catch (MessagingException ex) {
                    LoggerFactory.getLogger(this.getClass()).error(Msg.EXCEPTION_MESSAGE, this.getClass().getSimpleName(), ex);
                }
                session.setAttribute("sucesso", Msg.ADMINISTRADOR_SUCCESSFULLY_REGISTERED);

            }

        } else {//alterando
            //System.out.println("alterando");
            alterar_administrador = administradorService.getAdministradorById(Long.parseLong(request.getParameter("operacao_administrador")));

            //Alterar Endereco
            Endereco alterar_endereco = alterar_administrador.getUsuario().getEndereco();
            alterar_endereco.setDistanciaSede(0);
            alterar_endereco.setLocalidade(localidade);
            alterar_endereco.setMunicipio(municipioService.getMunicipioById(Long.parseLong(municipio_id)));

            //Alterar Usuario
            Usuario alterar_usuario = alterar_administrador.getUsuario();
            alterar_usuario.setNome(usuario_nome);
            alterar_usuario.setApelido(apelido);
            alterar_usuario.setCpf(cpf);
            alterar_usuario.setRg(rg);
            alterar_usuario.setEmail(email);

            //Alterar Contato
            Contato alterar_c1 = alterar_administrador.getUsuario().getContatos().get(0);
            alterar_c1.setNumero(contato1);

            if (alterar_administrador.getUsuario().getContatos().size() > 1) {
                Contato alterar_c2 = alterar_administrador.getUsuario().getContatos().get(1);
                if (contato2.trim().isEmpty() != true) {
                    alterar_c2.setNumero(contato2);
                }
            } else {
                if (contato2.trim().isEmpty() != true) {//para casos com um telefone
                    Contato contatoAdd = new Contato();
                    contatoAdd.setUsuario(alterar_administrador.getUsuario());
                    contatoAdd.setNumero(contato2);
                    alterar_administrador.getUsuario().getContatos().add(contatoAdd);
                }
            }

            if (administradorService.updateAdministrador(alterar_administrador)) {
                session.setAttribute("sucesso", Msg.SUCCESSFULLY_EDITED);
            } else {
                session.setAttribute("erro", Msg.OPERATIONAL_ERROR_EDITING);
            }
        }
        return "/ServletCentral?comando=CmdListarAdministradores";
    }
}
